﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Collections;
using System.Text.RegularExpressions;

namespace ThiTracNghiem
{
    public partial class FormQLDSGiaoVien : Form
    {
        Stack<GiaoVien> undoStack = new Stack<GiaoVien>();

        public FormQLDSGiaoVien()
        {
            InitializeComponent();
        }

        public static bool ValidateInput(KeyPressEventArgs e)
        {
            bool blDiscardUserInput = true;

            if (Char.IsLetter(e.KeyChar))
                return false;

            // Backspace or Space
            if (e.KeyChar == 8 || e.KeyChar == (char)Keys.Space)
                blDiscardUserInput = false;

            return blDiscardUserInput;
        }

        public String generateCode()
        {
            ArrayList listMaGV = new ArrayList();

            foreach (DataGridViewRow row in dgvGV.Rows)
            {
                listMaGV.Add(row.Cells[0].Value.ToString().Trim());
            }
            if (listMaGV.Count > 0)
            {
                listMaGV.Sort();
                int start = int.Parse(listMaGV[0].ToString().Substring(2));
                int end = int.Parse(listMaGV[listMaGV.Count - 1].ToString().Substring(2));

                for (int i = 1; i < end; i++)
                {
                    String temp = "GV" + i.ToString("000000");
                    if (!listMaGV.Contains(temp))
                    {
                        return temp;
                    }
                }
                return ("GV" + (end + 1).ToString("000000"));
            }
            else
            {
                return "GV000001";
            }
        }

        private void FormQLDSGiaoVien_Load(object sender, EventArgs e)
        {
            using (SqlConnection con = new SqlConnection(Program.ConnectionString))
            {
                using (SqlCommand cmd = new SqlCommand("SP_GETALL_GV", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    try
                    {
                        con.Open();
                        SqlDataReader reader = cmd.ExecuteReader();
                        while (reader.Read())
                        {
                            DataGridViewRow row = new DataGridViewRow();
                            row.CreateCells(dgvGV);
                            row.Cells[0].Value = reader[0].ToString().Trim();
                            row.Cells[1].Value = reader[1].ToString().Trim();
                            row.Cells[2].Value = reader[2].ToString().Trim();
                            row.Cells[3].Value = reader[3].ToString().Trim();
                            dgvGV.Rows.Add(row);
                        }
                        reader.Close();
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        private void btnThem_Click(object sender, EventArgs e)
        {
            txtMaGV.Text = generateCode();
            txtHo.ReadOnly = false;
            txtTen.ReadOnly = false;
            txtTenLogin.ReadOnly = false;
            txtHo.Text = "";
            txtTen.Text = "";
            txtTenLogin.Text = "";

            pnButtonThemHuy.Visible = true;
            btnOK.Text = "Thêm";
            btnThem.Enabled = false;
            btnSua.Enabled = false;
            btnXoa.Enabled = false;
            btnTim.Enabled = false;
            dgvGV.Enabled = false;
        }

        private void dgvGV_SelectionChanged(object sender, EventArgs e)
        {
            if (dgvGV.SelectedRows.Count > 0)
            {
                DataGridViewRow row = dgvGV.SelectedRows[0];
                txtMaGV.Text = row.Cells[0].Value.ToString();
                txtHo.Text = row.Cells[1].Value.ToString();
                txtTen.Text = row.Cells[2].Value.ToString();
                txtTenLogin.Text = row.Cells[3].Value.ToString();
            }
            else
            {
                txtMaGV.Text = "";
                txtHo.Text = "";
                txtTen.Text = "";
                txtTenLogin.Text = "";
            }
        }


        String backupHo = "";
        String backupTen = "";
        String backupTenLogin = "";
        private void btnSua_Click(object sender, EventArgs e)
        {
            if (dgvGV.SelectedRows.Count > 0)
            {
                txtHo.ReadOnly = false;
                txtTen.ReadOnly = false;
                txtTenLogin.ReadOnly = false;
                backupHo = txtHo.Text;
                backupTen = txtTen.Text;
                backupTenLogin = txtTenLogin.Text;

                pnButtonThemHuy.Visible = true;
                btnOK.Text = "Xong";
                btnCancel.Text = "Hủy bỏ";
                btnThem.Enabled = false;
                btnSua.Enabled = false;
                btnXoa.Enabled = false;
                btnTim.Enabled = false;
                dgvGV.Enabled = false;
            }
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            if (dgvGV.SelectedRows.Count > 0)
            {
                //int readyToDel = 1;
                DataGridViewRow row = dgvGV.SelectedRows[0];

                if (row.Cells[0].Value.ToString().Trim().Equals(Program.CurrentUser))
                {
                    MessageBox.Show("Bạn không thể xóa chính mình.", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                //using (SqlConnection con = new SqlConnection(ConnectionString))
                //{
                //    using (SqlCommand cmd = new SqlCommand())
                //    {
                //        //cmd.CommandType = CommandType.StoredProcedure;
                //        //cmd.Parameters.Add("@MAGV", SqlDbType.Char).Value = dgvGV.SelectedRows[0].Cells[0].Value.ToString();
                //        cmd.Connection = con;
                //        cmd.CommandText = "select dbo.FN_ISOK_TO_DEL_GV('" + row.Cells[0].Value.ToString() + "')";
                //        cmd.CommandType = CommandType.Text;
                //        try
                //        {
                //            con.Open();
                //            readyToDel = (int)cmd.ExecuteScalar();
                //        }
                //        catch (System.Exception ex)
                //        {
                //            MessageBox.Show(ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //            return;
                //        }
                //    }
                //}
                //if (readyToDel == 0)
                //{
                //    MessageBox.Show("Bạn không thể xóa thông tin giáo viên này!\nLý do: Có 1 bộ đề hoặc thông tin đăng nhập đang sử dụng thông tin giáo viên này.", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                //    return;
                //}
                DialogResult result = MessageBox.Show("Bạn chắc chắn muốn xóa thông tin giáo viên này?\nLưu ý: Việc này đông nghĩa với bạn sẽ xóa các bộ đề giáo viên này đã tạo và cả thông tin đăng nhập của giáo viên này.", "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.Yes)
                {
                    GiaoVien gv = new GiaoVien(3, row.Cells[0].Value.ToString(), row.Cells[1].Value.ToString(), row.Cells[2].Value.ToString(), row.Cells[3].Value.ToString());
                    undoStack.Push(gv);
                    btnUndo.Enabled = true;
                    dgvGV.Rows.RemoveAt(row.Index);
                }
            }
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            txtHo.Text = Regex.Replace(txtHo.Text, @"\s+", " ").Trim();
            txtTen.Text = Regex.Replace(txtTen.Text, @"\s+", " ").Trim();
            txtTenLogin.Text = Regex.Replace(txtTenLogin.Text, @"\s+", " ").Trim();

            if (txtHo.Text.Equals("") || txtTen.Text.Equals("") || txtTenLogin.Text.Equals(""))
            {
                MessageBox.Show("Bạn phải nhập đầy đủ các trường thông tin.", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (btnOK.Text.Equals("Thêm"))
            {
                foreach (DataGridViewRow r in dgvGV.Rows)
                {
                    if (r.Cells[3].Value.ToString().ToUpper().Equals(txtTenLogin.Text.ToUpper()))
                    {
                        MessageBox.Show("Tên login đã tồn tại, xin hãy chọn 1 tên login khác.", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                }

                DataGridViewRow row = new DataGridViewRow();
                row.CreateCells(dgvGV);
                row.Cells[0].Value = txtMaGV.Text;
                row.Cells[1].Value = txtHo.Text;
                row.Cells[2].Value = txtTen.Text;
                row.Cells[3].Value = txtTenLogin.Text;
                dgvGV.Rows.Add(row);

                GiaoVien gv = new GiaoVien(1, txtMaGV.Text.Trim(), txtHo.Text.Trim(), txtTen.Text.Trim(), txtTenLogin.Text.Trim());
                undoStack.Push(gv);
                btnUndo.Enabled = true;

                dgvGV.Rows[dgvGV.RowCount - 1].Selected = true;

                dgvGV.Sort(dgvGV.Columns[0], ListSortDirection.Ascending);
            }
            else
            {
                if (txtHo.Text.Equals(backupHo) && txtTen.Text.Equals(backupTen) && txtTenLogin.Text.ToUpper().Equals(backupTenLogin))
                {

                }
                else
                {
                    if (!txtTenLogin.Text.ToUpper().Equals(backupTenLogin))
                    {
                        foreach (DataGridViewRow r in dgvGV.Rows)
                        {
                            if (r.Cells[3].Value.ToString().ToUpper().Equals(txtTenLogin.Text.ToUpper()))
                            {
                                MessageBox.Show("Tên login đã tồn tại, xin hãy chọn 1 tên login khác.", "Cảnh báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                return;
                            }
                        }
                    }
                    DataGridViewRow row = dgvGV.SelectedRows[0];
                    row.Cells[1].Value = txtHo.Text;
                    row.Cells[2].Value = txtTen.Text;
                    row.Cells[3].Value = txtTenLogin.Text;

                    GiaoVien gv = new GiaoVien(2, txtMaGV.Text.Trim(), txtHo.Text.Trim(), txtTen.Text.Trim(), txtTenLogin.Text.Trim());
                    gv.HoGVOld = backupHo;
                    gv.TenGVOld = backupTen;
                    gv.TenLoginOld = backupTenLogin;

                    undoStack.Push(gv);
                    btnUndo.Enabled = true;
                }
            }

            pnButtonThemHuy.Visible = false;

            txtHo.ReadOnly = true;
            txtTen.ReadOnly = true;
            txtTenLogin.ReadOnly = true;

            btnThem.Enabled = true;
            btnXoa.Enabled = true;
            btnSua.Enabled = true;
            btnTim.Enabled = true;
            dgvGV.Enabled = true;
        }

        private void txtHo_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = ValidateInput(e);
        }

        private void txtTen_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = ValidateInput(e);
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            pnButtonThemHuy.Visible = false;
            dgvGV.Enabled = true;

            DataGridViewRow row = dgvGV.SelectedRows[0];
            txtMaGV.Text = row.Cells[0].Value.ToString();
            txtHo.Text = row.Cells[1].Value.ToString();
            txtTen.Text = row.Cells[2].Value.ToString();
            txtTenLogin.Text = row.Cells[3].Value.ToString();

            txtHo.ReadOnly = true;
            txtTen.ReadOnly = true;
            txtTenLogin.ReadOnly = true;

            btnThem.Enabled = true;
            btnXoa.Enabled = true;
            btnTim.Enabled = true;
            btnSua.Enabled = true;
        }

        private void btnUndo_Click(object sender, EventArgs e)
        {
            if (undoStack.Count > 0)
            {
                GiaoVien gv = undoStack.Peek();
                switch (gv.MaLenh)
                {
                    case 1:
                        foreach (DataGridViewRow r in dgvGV.Rows)
                        {
                            if (r.Cells[0].Value.ToString().Trim().Equals(gv.MaGV))
                            {
                                int index = r.Index;
                                if (index - 1 >= 0)
                                {
                                    dgvGV.Rows[index - 1].Selected = true;
                                }

                                dgvGV.Rows.RemoveAt(index);
                                undoStack.Pop();
                                if (undoStack.Count == 0)
                                    btnUndo.Enabled = false;
                                break;
                            }
                        }
                        break;
                    case 2:
                        foreach (DataGridViewRow r in dgvGV.Rows)
                        {
                            if (r.Cells[0].Value.ToString().Trim().Equals(gv.MaGV))
                            {
                                int index = r.Index;

                                r.Cells[1].Value = gv.HoGVOld;
                                r.Cells[2].Value = gv.TenGVOld;
                                r.Cells[3].Value = gv.TenLoginOld;

                                txtMaGV.Text = gv.MaGV;
                                txtTenLogin.Text = gv.TenLoginOld;
                                txtHo.Text = gv.HoGVOld;
                                txtTen.Text = gv.TenGVOld;

                                undoStack.Pop();
                                if (undoStack.Count == 0)
                                    btnUndo.Enabled = false;

                                dgvGV.Rows[index].Selected = true;
                                break;
                            }
                        }
                        break;
                    case 3:
                        DataGridViewRow row = new DataGridViewRow();
                        row.CreateCells(dgvGV);
                        row.Cells[0].Value = gv.MaGV;
                        row.Cells[1].Value = gv.HoGV;
                        row.Cells[2].Value = gv.TenGV;
                        row.Cells[3].Value = gv.TenLogin;
                        dgvGV.Rows.Add(row);
                        dgvGV.Sort(dgvGV.Columns[0], ListSortDirection.Ascending);

                        undoStack.Pop();
                        if (undoStack.Count == 0)
                            btnUndo.Enabled = false;
                        break;
                }
            }
        }

        private void btnHuyAll_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void btnGhiAll_Click(object sender, EventArgs e)
        {
            using (SqlConnection con = new SqlConnection(Program.ConnectionString))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandType = CommandType.StoredProcedure;
                con.Open();
                for (int i = undoStack.Count - 1; i >= 0; i--)
                {
                    GiaoVien obj = undoStack.ElementAt(i);
                    cmd.Parameters.Clear();
                    try
                    {
                        switch (obj.MaLenh)
                        {
                            case 1:
                                cmd.CommandText = "SP_INS_GV";
                                cmd.Parameters.Add("@MAGV", SqlDbType.Char).Value = obj.MaGV;
                                cmd.Parameters.Add("@HO", SqlDbType.NVarChar).Value = obj.HoGV;
                                cmd.Parameters.Add("@TEN", SqlDbType.NVarChar).Value = obj.TenGV;
                                cmd.Parameters.Add("@TENLOGIN", SqlDbType.Char).Value = obj.TenLogin;
                                cmd.ExecuteNonQuery();
                                break;

                            case 2:
                                cmd.CommandText = "SP_UPDATE_GV";
                                cmd.Parameters.Add("@MAGV", SqlDbType.Char).Value = obj.MaGV;
                                cmd.Parameters.Add("@LOGINCU", SqlDbType.Char).Value = obj.TenLoginOld;
                                cmd.Parameters.Add("@HO", SqlDbType.NVarChar).Value = obj.HoGV;
                                cmd.Parameters.Add("@TEN", SqlDbType.NVarChar).Value = obj.TenGV;
                                cmd.Parameters.Add("@LOGIN", SqlDbType.Char).Value = obj.TenLogin;
                                cmd.ExecuteNonQuery();
                                break;
                            case 3:
                                cmd.CommandText = "SP_DEL_GV";
                                cmd.Parameters.Add("@MAGV", SqlDbType.Char).Value = obj.MaGV;
                                cmd.Parameters.Add("@LOGIN", SqlDbType.Char).Value = obj.TenLogin;
                                cmd.ExecuteNonQuery();
                                break;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        MessageBox.Show("Tác vụ không thành công.\nLỗi: " + ex.Message, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }
                }
                undoStack.Clear();
                btnUndo.Enabled = false;
                MessageBox.Show("Ghi xuống cơ sở dữ liệu thành công!", "Xin chúc mừng", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }  
        }

        private void btnTim_Click(object sender, EventArgs e)
        {

        }

        private void txtTenLogin_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = ValidateInputLogin(e);
        }

        public static bool ValidateInputLogin(KeyPressEventArgs e)
        {
            if (Char.IsLetter(e.KeyChar))
                return false;

            if (Char.IsNumber(e.KeyChar))
                return false;

            // Backspace or Space
            if (e.KeyChar == 8)
                return false;

            return true;
        }
    }
}
